package generics;

import java.util.ArrayList;
import java.util.List;

// 定义父类和子类
class Fruit {}
class Apple extends Fruit {}
class Banana extends Fruit {}

public class UpperBoundedWildcard {
    // 上界通配符：只能接收Fruit或其子类的List
    public static double getTotalWeight(List<? extends Fruit> fruits) {
        double total = 0;
        // 可以安全读取（元素至少是Fruit类型）
        for (Fruit fruit : fruits) {
            total += 1.0; // 简化示例，假设每个水果重1.0
        }
        return total;
    }

    public static void main(String[] args) {
        List<Fruit> fruitList = new ArrayList<>();
        fruitList.add(new Apple());
        fruitList.add(new Banana());

        List<Apple> appleList = new ArrayList<>();
        appleList.add(new Apple());
        appleList.add(new Apple());

        // 上界通配符可以接收Fruit及其子类的List
        System.out.println("水果总重量：" + getTotalWeight(fruitList)); // 2.0
        System.out.println("苹果总重量：" + getTotalWeight(appleList)); // 2.0

        // 注意：上界通配符的集合不能添加元素（除了null）
        List<? extends Fruit> fruitBasket = new ArrayList<>();
        // fruitBasket.add(new Apple()); // 编译错误：无法确定具体类型
        // fruitBasket.add(new Fruit()); // 编译错误
    }
}
